﻿using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using NovaSystem.ComponentesNegocio;
using System.Data;
using System.Globalization;
using NovaSystem.EntidadesNegocio;
using System.Transactions;
using AnovoAndes.Framework.Utilidades;

namespace NovaSystem.InterfazUsuarioWeb.Contabilidad
{
    
    public partial class wfComprobante : System.Web.UI.Page
    {
        string CONCEPTO_TIPOCOMPROBANTE = "TIPO COMPROBANTE";
        string CONCEPTO_CENTROCOSTO = "CENTRO COSTO";
        int COL_CUENTA = 0;
        int COL_CENTROCOSTO = 1;
        int COL_FECHA = 2;
        int COL_DOCTO = 3;
        int COL_GLOSA = 4;
        int COL_RUT = 5;
        int COL_NOMBRE = 6;
        int COL_REF = 7;
        int COL_DEBE = 8;
        int COL_HABER = 9;
        CultureInfo culturaMoneda = new CultureInfo(configuracion.Instancia.CulturaMoneda);

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                LlenarCombos();
                CrearTablaTemporal();
                InicializarPagina();
            }
            FuncionesJavaScript();
        }

        private void InicializarPagina()
        {
            txtFechaComprobante.Text = DateTime.Now.ToShortDateString();
            txtFecha.Text = DateTime.Now.ToShortDateString();
        }

        private void FuncionesJavaScript()
        {
            txtRut.Attributes.Add("onkeypress", "return clickButton(event,'" + btnBuscarCliente.ClientID + "')");
            btnAceptarMsg.Attributes.Add("onclick", "if (document.getElementById('" + txtGrabar.ClientID + "').value=='1'){document.getElementById('" + btnGrabar.ClientID + "').disabled=true;}");
        }

        private void CrearTablaTemporal()
        {
            DataTable tblComprobante = new DataTable("tblComprobante");
            DataColumn colCuenta = new DataColumn("Cuenta",typeof(string));
            DataColumn colCentroCosto = new DataColumn("C.Costo", typeof(string));
            DataColumn colFecha = new DataColumn("Fecha",typeof(DateTime));
            DataColumn colDocto = new DataColumn("Docto", typeof(string));
            DataColumn colGlosa = new DataColumn("Glosa",typeof(string));
            DataColumn colRut = new DataColumn("Rut",typeof(string));
            DataColumn colNombre = new DataColumn("Nombre",typeof(string));
            DataColumn colReferencia = new DataColumn("Ref.",typeof(string));
            DataColumn colDebe = new DataColumn("Debe",typeof(decimal));
            DataColumn colHaber = new DataColumn("Haber",typeof(decimal));
            tblComprobante.Columns.Add(colCuenta);
            tblComprobante.Columns.Add(colCentroCosto);
            tblComprobante.Columns.Add(colFecha);
            tblComprobante.Columns.Add(colDocto);
            tblComprobante.Columns.Add(colGlosa);
            tblComprobante.Columns.Add(colRut);
            tblComprobante.Columns.Add(colNombre);
            tblComprobante.Columns.Add(colReferencia);
            tblComprobante.Columns.Add(colDebe);
            tblComprobante.Columns.Add(colHaber);
            Session["tblComprobante"] = tblComprobante;

        }

        private void LlenarCombos()
        {
            ddlTipoComprobante.DataSource = Negociomantenedor.Instancia.Listar(CONCEPTO_TIPOCOMPROBANTE);
            ddlTipoComprobante.DataBind();

            ddlCentroCosto.DataSource = Negociomantenedor.Instancia.Listar(CONCEPTO_CENTROCOSTO);
            ddlCentroCosto.DataBind();
        }

        protected void btnAgregar_Click(object sender, EventArgs e)
        {
            decimal monto = 0;
            DataTable tblComprobante = (DataTable)Session["tblComprobante"];
            if (!Existe(tblComprobante))
            {
                DataRow nuevaFila = tblComprobante.NewRow();
                nuevaFila["Cuenta"] = txtCuenta.Text;
                nuevaFila["C.Costo"] = ddlCentroCosto.SelectedValue;
                nuevaFila["Fecha"] = txtFecha.Text;
                nuevaFila["Docto"] = txtDocumento.Text;
                nuevaFila["Glosa"] = txtGlosa.Text;
                nuevaFila["Rut"] = txtRut.Text;
                nuevaFila["Nombre"] = txtNombre.Text;
                nuevaFila["Ref."] = txtReferencia.Text;
                decimal.TryParse(txtMonto.Text, out monto);
                if (ddlDebeHaber.SelectedValue.Trim().ToLower() == "debe")
                {
                    nuevaFila["Debe"] = monto;
                    nuevaFila["Haber"] = 0;
                }
                else
                {
                    nuevaFila["Debe"] = 0;
                    nuevaFila["Haber"] = monto;
                }
                tblComprobante.Rows.Add(nuevaFila);
                Session["tblComprobante"] = tblComprobante;
                gvDetalle.DataSource = tblComprobante;
                gvDetalle.DataBind();
            }

            ObtenerTotales();
            LimpiarDetalle();

        }

        private void LimpiarDetalle()
        {
            txtCuenta.Text = "";
            txtDocumento.Text = "";
            txtGlosa.Text = "";
            txtMonto.Text = "";
            txtRut.Text = "";
            txtNombre.Text = "";
            txtReferencia.Text = "";
        }

        private void ObtenerTotales()
        {
            culturaMoneda.NumberFormat.CurrencyDecimalDigits = 0;
            DataTable tblComprobante = (DataTable)Session["tblComprobante"];
            decimal debe = 0;
            decimal haber = 0;
            decimal saldo = 0;
            if (tblComprobante.Rows.Count > 0)
            {
                debe = (decimal)tblComprobante.Compute("sum(debe)", "");
                haber = (decimal)tblComprobante.Compute("sum(haber)", "");
                saldo = debe - haber;
            }
            txtDebe.Text = debe.ToString("c", culturaMoneda);
            txtHaber.Text = haber.ToString("c", culturaMoneda);
            txtSaldo.Text = saldo.ToString("c", culturaMoneda);
        }

        private bool Existe(DataTable tblComprobante)
        {
            return false;
        }

        protected void btnAgregarDetalle_Click(object sender, EventArgs e)
        {

        }

       

        protected void btnBuscarRut_Click(object sender, ImageClickEventArgs e)
        {
            if (txtRut.Text.Length > 0)
            {
                string rut = txtRut.Text.Replace(".", "").Replace("-", "");
                cliente _cliente = Negociocliente.Instancia.BuscarRut(rut);
                if (_cliente != null)
                {
                    txtNombre.Text = _cliente.nombreCliente;
                    hfIdCliente.Value = _cliente.idCliente.ToString();
                }
                else
                {
                    //ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "click", "ModalPopup3('wfBCliente.aspx','dialogHeight:400px;dialogWidth:790px;edge:sunken;status:no;unadorned:yes','" + txtRutCliente.ClientID + "','" + txtNombreCliente.ClientID + "','" + hfIdCliente.ClientID + "');return false;", true);
                    ScriptManager.RegisterStartupScript(this, this.GetType(), "click", "var o=window.showModalDialog('" + ResolveClientUrl("~") + "Ventas/wfBCliente.aspx',null,'dialogHeight:400px;dialogWidth:790px;edge:sunken;status:no;unadorned:yes');if (o!=null){document.getElementById('" + txtRut.ClientID + "').value=o.value;document.getElementById('" + txtNombre.ClientID + "').value = o.text;document.getElementById('" + hfIdCliente.ClientID + "').value=o.aux;}", true);
                }
            }
            else
            {
                //Page.ClientScript.RegisterClientScriptBlock(GetType(), "onclick", "ModalPopup3('wfBCliente.aspx','dialogHeight:400px;dialogWidth:790px;edge:sunken;status:no;unadorned:yes','" + txtRutCliente.ClientID + "','" + txtNombreCliente.ClientID + "','" + hfIdCliente.ClientID + "');return false;", true);
                ScriptManager.RegisterStartupScript(this, this.GetType(), "click", "var o=window.showModalDialog('" + ResolveClientUrl("~") + "Ventas/wfBCliente.aspx',null,'dialogHeight:400px;dialogWidth:790px;edge:sunken;status:no;unadorned:yes');if (o!=null){document.getElementById('" + txtRut.ClientID + "').value=o.value;document.getElementById('" + txtNombre.ClientID + "').value = o.text;document.getElementById('" + hfIdCliente.ClientID + "').value=o.aux;}", true);
                //ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "click", "ModalPopup3('wfBCliente.aspx','dialogHeight:400px;dialogWidth:790px;edge:sunken;status:no;unadorned:yes','" + txtRutCliente.ClientID + "','" + txtNombreCliente.ClientID + "','" + hfIdCliente.ClientID + "')", true);
            }
            mpeDetalle.Show();
        }

        protected void btnGrabar_Click(object sender, EventArgs e)
        {
            try
            {
                if (ValidacionExitosa())
                {
                    using (TransactionScope tran = new TransactionScope())
                    {
                        txtGrabar.Text = "";
                        int idComprobante = GrabarEnc();
                        GrabarDet(idComprobante);
                        tran.Complete();
                        txtGrabar.Text = "1";
                        lblMsg.Text = "El registro se ha grabado con éxito";
                        mpeMensaje.Show();
                    }

                }
            }
            catch (Exception ex)
            {
                ControlErrores.ErrorUsuario(ex, Context, "");
            }
        }
        private void GrabarDet(int idComprobante)
        {
            int numeroComprobante = 0;
            DataTable tblComprobante = (DataTable)Session["tblComprobante"];
            int.TryParse(txtComprobante.Text, out numeroComprobante);
            foreach (DataRow fila in tblComprobante.Rows)
            {
                DateTime fecha = new DateTime(1900, 1, 1);
                decimal debe = 0;
                decimal haber = 0;

                comprobantedet _comprobantedet = new comprobantedet();
                _comprobantedet.idComprobante = idComprobante;
                _comprobantedet.conceptoCentroCosto = CONCEPTO_CENTROCOSTO;
                _comprobantedet.codigoCentroCosto = fila[COL_CENTROCOSTO].ToString();
                _comprobantedet.cuenta = fila[COL_CUENTA].ToString();
                _comprobantedet.documento = fila[COL_DOCTO].ToString();
                DateTime.TryParse(fila[COL_FECHA].ToString(),out fecha);
                _comprobantedet.fecha = fecha;
                _comprobantedet.glosa = fila[COL_GLOSA].ToString();
                _comprobantedet.numeroComprobante = numeroComprobante;
                _comprobantedet.rut = fila[COL_RUT].ToString();
                _comprobantedet.usuario = ObtenerUsuario();
                decimal.TryParse(fila[COL_DEBE].ToString(),out debe);
                decimal.TryParse(fila[COL_HABER].ToString(),out haber);
                _comprobantedet.debe = debe;
                _comprobantedet.haber = haber;
                Negociocomprobantedet.Instancia.Insertar(_comprobantedet);
            }
        }

        private int GrabarEnc()
        {
            DateTime fechaComprobante = new DateTime(1900, 1, 1);
            int numeroComprobante = 0;
            DateTime.TryParse(txtFechaComprobante.Text, out fechaComprobante);
            int.TryParse(txtComprobante.Text, out numeroComprobante);
            comprobante _comprobante = new comprobante();
            _comprobante.concepto = txtConcepto.Text;
            _comprobante.fechaComprobante = fechaComprobante;
            _comprobante.numeroComprobante = numeroComprobante;
            _comprobante.usuario = ObtenerUsuario();

            return Negociocomprobante.Instancia.Insertar(_comprobante);
        }

        private bool ValidacionExitosa()
        {
            bool v = false;
            decimal saldo = 0;
            decimal debe = 0;
            decimal haber = 0;

            decimal.TryParse(txtDebe.Text,NumberStyles.Any,culturaMoneda, out debe);
            decimal.TryParse(txtHaber.Text,NumberStyles.Any,culturaMoneda, out haber);
            decimal.TryParse(txtSaldo.Text,NumberStyles.Any,culturaMoneda, out saldo);
            if (debe > 0 && debe == haber)
            {
                v = true;
            }
            else
            {
                imgMsg.ImageUrl = "~/img/warning.png";
                lblMsg.Text = "Existe un problema de cuadratura (debe <> haber)";
                mpeMensaje.Show();
            }
            return v;
        }

        private string ObtenerUsuario()
        {
            return Context.User.Identity.Name;
        }

        protected void gvDetalle_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                DateTime fecha = new DateTime(1900,1,1);
                DateTime.TryParse(e.Row.Cells[COL_FECHA].Text, out fecha);
                e.Row.Cells[COL_FECHA].Text = fecha.ToShortDateString();
            }
        }

        protected void btnLimpiar_Click(object sender, EventArgs e)
        {
            txtGrabar.Text = "";
            CrearTablaTemporal();
            txtConcepto.Text = "";
            txtFechaComprobante.Text = DateTime.Now.ToShortDateString();
            txtComprobante.Text = "";
            txtSaldo.Text = "";
            txtDebe.Text = "";
            txtHaber.Text = "";

        }

    }
}
